// pages/goods/qkd.js
import {
  baseUrl
} from '../../../config'
import pay from '../../../model/pay'
import order from '../../../model/order'
import product from '../../../model/product'
import spec from '../../../model/spec'
import userAddr from '../../../model/userAddr'
import userCoupon from '../../../model/userCoupon'
import {
  afterMinute,
  afterDay,
  formatDate
} from '../../../utils/util'

let msg
Page({

  data: {
    //加载数据
    id: '',
    //商品详情
    product: {},
    //规格
    spec: {},
    //预约时间
    date: '',
    time: '',
    aptTime: '',
    startDate: '',
    endDate: '',
    startTime: '',
    //备注说明
    attachText: '',
    //图片备注
    attachFileList: [],
    //收货地址
    addrList: [],
    addrId: '',
    //下单结果
    order: {},
    //订单确认弹窗
    paySwitch: false,
    uploadUrl: baseUrl + '/file/upload',

    //消费券
    userCouponList: [],
    //选中的优惠券id
    userCouponId: '',
    //是否展示消费券列表
    couponOpen: false,
    //mp-uploader
    fileList: []
  },


  // 图片上传
  afterRead(event) {
    const _this = this;
    const files = event.detail.file;
    let {
      fileList = []
    } = this.data;
    let currentIndex = 0;

    wx.showLoading({
      title: '上传中...',
    });

    function uploadNext() {
      if (currentIndex < files.length) {
        const file = files[currentIndex];
        wx.uploadFile({
          url: _this.data.uploadUrl,
          name: 'file',
          filePath: file.url,
          success(res) {
            if (res.errMsg !== 'uploadFile:ok') {
              wx.hideLoading();
              msg && msg.show({
                text: '上传失败，图片异常'
              });
              return;
            }
            let result = JSON.parse(res.data);
            if (result.code != 200 || result.data.length === 0) {
              wx.hideLoading();
              msg && msg.show({
                text: result.msg
              });
              return;
            }

            fileList.push({
              url: result.data.url
            });
            _this.setData({
              fileList: fileList
            });

            currentIndex++;
            uploadNext(); // 继续上传下一张图片
          },
          complete() {
            if (currentIndex === files.length) {
              wx.hideLoading(); // 所有图片上传完成后隐藏加载提示
              msg && msg.show({
                text: '上传成功'
              });
            }
          }
        });
      }
    }

    uploadNext(); // 开始上传第一张图片
  },
  //删除图片
  deleteImg(e) {
    let fileList = this.data.fileList
    const index = e.detail.index
    fileList.splice(index, 1);
    this.setData({
      fileList: fileList
    })
  },
  /**
   * 消费券勾选
   * @param {*} e 
   */
  couponRadio(e) {
    let userCouponId = e.detail.value
    this.setData({
      userCouponId: userCouponId
    })
  },
  /**
   * 是否使用优惠券
   * @param {*} e 
   */
  couponSwitch(e) {
    let val = e.detail.value
    if (val) {
      this.setData({
        userCouponId: '',
        couponOpen: val
      })
    } else {
      this.setData({
        userCouponId: '',
        couponOpen: val
      })
    }

  },


  /**
   * 规格选中
   * @param {*} e 
   */
  specTap(e) {
    let tagIds = e.detail.tagIds
    this.setData({
      tagIds: tagIds
    })

    //校验是否标签都选中了
    let tagTree = this.data.product.tagTree
    let tagIdList = tagIds.split(',')
    // 遍历 tagTree 校验规格是否漏选
    for (let i = 0; i < tagTree.length; i++) {
      let tag = tagTree[i];
      if (this.checkTags(tag, tagIdList)) {
        return; // 提示选择对应的标签，并结束函数
      }
    }

    const reqData = {
      itemId: this.data.product.id,
      tagIds: tagIds
    }

    this.getSpec(reqData)

  },
  /**
   * 地址选中
   * @param {*} e 
   */
  addrTap(e) {
    let addrId = e.detail.item.id
    this.setData({
      addrId: addrId
    })
  },


  /**
   * 日期改变
   * @param {*} e 
   */
  bindDateChange: function (e) { //日期选择
    console.log('picker发送选择改变，携带值为', e.detail.value)
    this.setData({
      date: e.detail.value
    })
  },
  /**
   * 时间改变
   * @param {*} e 
   */
  bindTimeChange: function (e) { //时间选择
    console.log('picker发送选择改变，携带值为', e.detail.value)
    this.setData({
      time: e.detail.value
    })
  },
  /**
   * 新增地址
   */
  add() {
    wx.navigateTo({
      url: '/pages/me/address/addedit/addedit',
    })
  },

  /**
   * 下单
   */
  place() {
    let aptTime = this.data.date + ' ' + this.data.time

    //校验是否标签都选中了
    if (this.data.product.tagTree && this.data.product.tagTree.length > 0) {
      let tagTree = this.data.product.tagTree
      let tagIds = this.data.tagIds.split(',')
      // 遍历 tagTree 校验规格是否漏选
      for (let i = 0; i < tagTree.length; i++) {
        let tag = tagTree[i];
        if (this.checkTags(tag, tagIds)) {
          wx.showToast({
            title: '请选择' + tag.name,
          });
          return; // 提示选择对应的标签，并结束函数
        }
      }
    }


    //规格
    const items = [{
      id: this.data.product.id,
      specId: this.data.spec.id,
      num: 1
    }]

    const fileList = this.data.fileList.map(item => item.url)
    const req = {
      items: items, //购物车
      aptTime: aptTime, //预约时间
      payMethod: 1, //支付方式，1：微信小程序
      addrId: this.data.addrId, //收货地址
      attachText: this.data.attachText, //附加说明
      attachFileList: fileList, //附加截图
    }
    //如果消费券勾选
    if (this.data.couponOpen && this.data.userCouponId) {
      req.userCouponId = this.data.userCouponId
    }

    if (!req.addrId) {
      wx.showToast({
        title: '请选择收货地址',
        icon: 'none'
      })
      return
    }

    //下单
    order.servPlace(req, res => {
      if (res.code == 200) {
        this.setData({
          order: res.data,
          paySwitch: true
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    })

  },
  /**
   * 递归查找子节点
   * @param {*} category 
   * @param {*} tag 
   * @param {*} tagIds 
   */
  checkTags(tag, tagIds) {
    let tagIdString = tag.id.toString();
    if (tagIds.includes(tagIdString)) {
      return false; // 如果当前节点的 id 在 tagIds 中，则返回 false
    }

    if (tag.children && tag.children.length > 0) {
      for (let i = 0; i < tag.children.length; i++) {
        if (!this.checkTags(tag.children[i], tagIds)) {
          return false;
        }
      }
    }

    return true; // 当前节点及其所有子孙节点的 id 都不在 tagIds 中，返回 true
  },
  //支付
  pay() {
    let that = this
    let reqData = {
      id: this.data.order.id
    }
    pay.prePay(reqData, (res => {
      if (res.code === 200) {
        let type
        const reqPay = res.data
        wx.requestPayment({
          "timeStamp": reqPay.timeStamp,
          "nonceStr": reqPay.nonceStr,
          "package": reqPay.package,
          "signType": "RSA",
          "paySign": reqPay.paySign,
          "success": function (res) {
            wx.showToast({
              title: '支付成功',
            })
            type = 1
          },
          "fail": function (res) {
            console.log('支付失败:', res)
            type = 2
          },
          "complete": function (res) {
            //关闭支付窗口
            that.setData({
              paySwitch: false
            })

            wx.navigateTo({
              url: '/pages/result/result?type=' + type,
            })
          }
        })
      } else if (res.code == 204) {
        wx.navigateTo({
          url: '/pages/result/result?type=' + 1,
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    }))

  },

  /**
   * 下单弹窗转换
   * @param {*} e 
   */
  paySwitch: function (e) {
    let val = e.currentTarget.dataset.val == 1 ? true : false
    this.setData({
      paySwitch: val
    })

  },
  //获取用户地址
  getAddrList() {
    //用户地址选择
    userAddr.list(null, res => {
      if (res.code == 200) {
        let addrList = []
        if (res.data) {
          addrList = res.data
        }
        this.setData({
          addrList: addrList
        })
        addrList.forEach(item => {
          if (item.isFirst == 1) {
            this.setData({
              addrId: item.id
            })
          }
        })
      }
    })
  },
  /**
   * 查询选中规格
   * @param {*} req 
   */
  getSpec(req) {
    spec.find(req, res => {
      if (res.code == 200) {
        this.setData({
          spec: res.data
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    })
  },
  /**
   * 加载商品
   * @param {*} reqData 
   */
  getDetail(reqData) {
    product.detail(reqData, res => {
      if (res.code == 200) {
        this.setData({
          product: res.data,
          spec: res.data.spec,
          tagIds: res.data.spec.tagIds
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    })

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.setData({
      id: options.id
    })
    //时间组件时间可选范围
    var currTime = new Date();
    const startDate = formatDate(currTime)
    const startTime = afterMinute(currTime, 10)
    const endDate = afterDay(currTime, 10)
    this.setData({
      startDate: startDate,
      endDate: endDate,
      startTime: startTime
    })
    const reqData = {
      id: options.id
    }
    this.getDetail(reqData)
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    msg = this.selectComponent("#msg")
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    this.getAddrList()
    this.getUserCouponList();
  },
  /**
   * 获取用户的消费券列表
   */
  getUserCouponList() {
    userCoupon.list({}, res => {
      if (res.code == 200) {
        this.setData({
          userCouponList: res.data
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    })
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  },
})